package com.nl.model.model.page;

import java.util.Collections;
import java.util.List;
import java.util.Objects;

/**
 * 分页.
 *
 * @param <T> 数据类型
 * @author breggor
 */
public interface Pagination<T> {
    /**
     * 空分页.
     */
    Pagination EMPTY = Pagination.of(10L, 0L, Collections.emptyList());

    /**
     * 总记录数.
     *
     * @return long
     */
    long getTotal();

    /**
     * 总页数.
     *
     * @return long
     */
    long getPages();

    /**
     * 数据集合.
     *
     * @return List
     */
    List<T> getRecords();

    /**
     * 创建分页.
     *
     * @param <E>     返回集合元素类型
     * @param size    每页行数
     * @param total   总行数
     * @param records 数据列表
     * @return Pagination
     */
    static <E> Pagination<E> of(long size, long total, List<E> records) {
        return new PaginationImpl<>(size, total, records);
    }

    /**
     * 创建分页.
     *
     * @param <E>     返回集合元素类型
     * @param page    分页数据
     * @param records 数据列表
     * @return Pagination
     */
    static <E> Pagination<E> of(Pagination page, List<E> records) {
        Objects.requireNonNull(page, "分页不能为null");
        Objects.requireNonNull(records, "数据集合不能为null");
        return new PaginationImpl(((PaginationImpl) page).getSize(), ((PaginationImpl) page).getTotal(), records);
    }
}
